perm filename WHO[SAI,BGB] blob sn#135680 filedate 1975-02-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00014 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	Definitions, Assignments
C00005 00003	Initialization, Main Loop
C00010 00004	
C00014 00005	Sw10, Spw -- Spacewar Loops
C00017 00006	Maklin -- Information Retrieval
C00019 00007	which job to do next?
C00022 00008	jblin -- job info for one job
C00028 00009		MOVE A,JBTJL(2)
C00032 00010	System Statistics
C00036 00011	Devices, Files
C00039 00012	Timit, Flchk, Await -- Random routines
C00041 00013	Num, Octout, Sixout, Strng -- Output Routines
C00043 00014		SUBTTL	Data
C00045 ENDMK
C⊗;
COMMENT ⊗Definitions, Assignments⊗
DEBMOD←←0

TITLE WHO


EXTERN JOBREL,JOBFF
PDLEN←←40
A←3
B←4
C←5
D←6
T←7
J←10
P←11
SPACE←12
PTR←13
RING←14
TEMP←15

runwin←←=20		; no. of passes jobs stay in "run" queue (R mode)
NUMJOB←←100
RINGLN←←=30
AVGING←←=15		;AVERAGING TIME CONSTANT

DDSIZ←←=35
IIISIZ←←=44

DEFINE INC(N),<REPEAT N,<IDPB SPACE,PTR
>>

DEFINE PUT(CHR),<MOVEI A,CHR
IDPB A,PTR
>

DEFINE SLEEP (SEC,AC) <
	MOVEI	AC,SEC
	CALLI	AC,31
>

DEFINE STRING (MSG) <
	MOVE	A,[POINT 7,[ASCIZ /MSG/]]
	PUSHJ	P,STRNG
>

OPDEF RESET [CALLI]
OPDEF EXIT  [CALLI 12]
OPDEF DISMIS[CALLI 400024]
OPDEF SPCWGO[CALLI 400003]
OPDEF PEEK  [CALLI 33]


JBTSTS←←210
PRJPRG←←211
JBTSWP←←212
SPWGO←←213
TTIME←←214
UPTIME←←215
CORMAX←←216
DEVLST←←217
TTYTAB←←220
TTNUMS←←221
JOBN←←222
JBTADR←←223
JOBNAM←←225
JOB←←226
SP2GO←←230
JOBQUE←←231
JBTPRI←←232
JBTJL←←233
QNAMS←←235
JBTLIN←←236
JBTJLH←←240
JBTGSL←←242
STBEG←←247
BIGHOL←←255
SHFWAT←←257
PTYJOB←←270
NJOBS←←275
JBTSIN←←307

FIT←←3
FORCE←←2
SEGWAIT←←6

RUNQ←←14
TQ←←15
INTWQ←←12
NULQ←←10
IOWQ←←5
STOPQ←←11

;LH JBTSTS
SHF←←4000
SWP←←2000
JNA←←240000	;JNA+CMWB (CMWB HOLDS A JOB SLOT ALSO)
JSEG←←1000
JLOG←←10000
JWP←←1

;RH JBTSTS
JLOCK←←100000

JLLENGTH←←=20

DEVNAM←←0
DEVCHR←←1
DEVIOS←←2
DEVSER←←3
DEVMOD←←4
DEVLOG←←5
DEVFIL←←11
DEVEXT←←12
DEVPPN←←14
FILLEN←←16
USETP←←19

DSKDEV←←200000
DIRDEV←←4
TTYDEV←←10
TTYATT←←20000

READB←←200000
WRITEB←←100000
ALTERB←←40000
IOEND←←40

NJRNUL←←22

	LOC	124		;REENTER ADDRESS
	RENTR			;MAKE LPT VERSION OF WHO. - REG.
	RELOC	0
COMMENT ⊗Initialization, Main Loop⊗

TTYOUT:	MOVE A,JOBREL		;HERE TO DO IT ONCE FOR A TTY.
	ADDI A,1777
	CALLI A,11
	JFCL			;SO WHAT IF HE GETS AN ILM
	MOVE	P,[IOWD PDLEN,PSHDWN]
	PUSHJ	P,TTYSPW
	MOVE	A,JOBREL
	MOVEM	A,JOBFF
	ADDI	A,2000
	CORE	A,
	JFCL
	OUTBUF	0,2
	MOVE	2,[POINT 7,TTYBUF]
	SKIPE	QUICKY
	MOVE	2,[POINT 7,QCKHED]
	PUSHJ	P,TTYSTR
	MOVE	2,[POINT 7,BUFSTR]	;TYPE THE WHOLE MESS
	PUSHJ	P,TTYSTR
	MOVE	2,[POINT 7,[BYTE(7)15,12,12]]
	PUSHJ	P,TTYSTR
	CLOSE	0,
	RELEAS	0,
	EXIT

TTYSTR:	ILDB	A,2
	JUMPE	A,[POPJ P,]
	SOSG	TTYBHD+2
	OUTPUT	0,
	IDPB	A,TTYBHD+1
	JRST	TTYSTR

RENTR:	TROA	A,1
START:	MOVEI	A,0
	MOVEM	A,RENFLG#
DOIT:	RESET
	SETZM QUICKY#		;WILL BE TURNED ON FOR SHORT TYPEOUT TO TTY
	SETZM ONAPTY#		;ON FOR PTY SO PTY OF DPY DOESN'T GET ESC CHARS
	MOVEI A,37		;SYSTEM JOBREL
	PEEK A,
	HRLZ A,A
	JUMPGE A,.+2
	HRRI A,540000
	CALL A,['SETPR2']	;FAILS IF 128<CORE<256.  DOESN'T MATTER IF
	JFCL			; PDP-6 UP (6 DATAOS ITS OWN PROT).
	MOVEI A,-400000(A)
	MOVNM A,ADR10#
	MOVEI A,TTNUMS
	PEEK A,
	MOVE B,A
	ANDI A,777
	MOVNS A
	HRLZM A,PTYPTR
	SETZB A,C
	LSHC A,9
	ADD C,A
	SETZ A,
	LSHC A,9
	ADD C,A
	SETZ A,
	LSHC A,9
	ADDI C,1(A)		;INCLUDE CTY
	MOVEM C,PTYL0#
	MOVEI A,PTYJOB
	PEEK A,
	HRRM A,PTYPTR#
OLDSYS:	MOVNI A,1		;ONLY DO SSW FROM DPY
	GETLIN A		;  BECAUSE NON-LOCAL USERS WOULD BOMB OUT
	AOJE A,OLDSY1
	TLNE A,4000
	SETOM ONAPTY		;DON'T TRY TO RESTORE PAGE PRINTER OF PTYJOB USER
	TLNE A,420000
	SPCWAR 'SSW'		;STOP ALL SPACEWAR
OLDSY1:	MOVSI -RINGLN
	MOVEM RNGSAV#
	SETZM LASTIM		;TABLE FOR COUNTDOWN FROM LAST TIME RUN
	MOVE A,[LASTIM,,LASTIM+1]
	BLT A,LASTIM+NUMJOB-1
	SETZM PASSN#
	SETZM AVGRUN#
	SETZM AVGK#
	MOVEI	1,=1000		;NO LIMIT IF TYPING
	MOVEM	1,LSTLIN
	MOVEI 1,1
	MOVEM 1,FSTLIN		;START ON LINE 1
	SETZ 1,
	GETPPN 1,
	HRRZM 1,PN1#
	SETZ 1,
	DSKPPN 1,
	HRRZM 1,PN2#
	SETOB 1,READY
	SKIPE	RENFLG
	JRST	TTYOUT		;FORCE TTY-STYLE OUTPUT AFTER REENTER
	GETLIN 	1
	CAMN 1,[-1]
	SETZ 1,
	TLNN 1,420000
	JRST	TTYOUT
	SETZM DDSW#
	TLNN 1,20000
	JRST NOTDD
	SETOM DDSW
	MOVE 1,CM1
	MOVEM 1,CMDWRD
	MOVE 1,CM2
	MOVEM 1,CMDWR1
NOTDD:	MOVEI	1,IIISIZ	;# LINES AT A TIME FOR III
	SKIPE	DDSW		;DATA-DISK?
	MOVEI	1,DDSIZ		;YES, FEWER LINES
	MOVEM	1,LSTLIN
	LSH	1,-1		;HALF A SCREEN GLITCHING
	MOVEM	1,SCRINC#
IFN DEBMOD,{	SKIPE DEBUG#
	JRST [	SETOM OTHER
		JRST SLP1]}
IFN 1,<				;CODE FOR DUAL PROCESSOR.
	MOVEI 2,1
	MOVEM 2,OTHER#		;FIND OUT WHO'S AROUND
	MOVE 1,[XWD 400000,[MOVEM 5,OTHER;OTHER IS -1 IF PDP-6 DOWN,
			    DISMIS]];0 OTHERWISE
	SPCWGO	1,
SLP0:	SLEEP	(0,1)		;WAIT FOR SPACEWAR JOB TO GO
	SKIPLE 	OTHER		;(OTHER SET NON-POSITIVE)
	 JRST	 SLP0
;>	SETOM OTHER#
	MOVE 1,[XWD 200017,SPW]
	SKIPL OTHER		;IS THE 6 UP?
	SPCWGO	1,		;YES, START MAIN ROUTINE THERE
	SKIPN DDSW
	PPACT 0
	SETZM HOLDIT		;DON'T STOP 10 YET
	MOVE 1,[XWD 400017,SW10]
	SPCWGO	1,		;START DPY ROUTINE AND AUX MAIN ON PDP-10
SLP1:	OUTSTR	[ASCIZ /
/]
	SETZM RONLY#		;CLEAR RUNNING JOBS ONLY MODE
	SETZM FOREVR

INAGAIN:MOVEI	A,=120			;RUN FOR TWO MINUTES
	MOVEI	B,1
	MOVEM	B,REPTT
US1:	MOVEM A,LCNT#
IFN DEBMOD,{	SKIPE DEBUG
	JRST DEBDIS}
US1A:	MOVE A,LCNT
	INCHRS	B			;DOES HE WANT SOMETHING?
	SOJG A,[	MOVEI B,1↔CALLI B,31
		JRST US1]
	CAIN	B,15			;SNARF UP LF IF CR
	INCHRW	B
	JUMPLE	A,LEEVE			;DOOMSDAY
US3:	MOVE	C,SCRINC		;GLITCH INCREMENT
	IMUL	C,REPTT#		;* # GLITCHES
	CAIE	B,"↓"			;MOVE TEXT DOWN?
	CAIN	B,":"	;no TOP key needed
	AOJA C,[CAMLE	C,FSTLIN#	;YES, LIMIT RETURN
	US2:	 MOVE	 C,FSTLIN	; TO TOP
		MOVNI C,-1(C)		;DECREMENT, NOT INCREMENT
 	DOWNGO:	JSP	TEMP,AWAIT	;WAIT FOR PDP-6 IDLE
		ADDM	C,FSTLIN	;GLITCH WHOLE SCREEN
		ADDM	C,LSTLIN#
		SETOM	READY		;SEND 6 OFF ON ANOTHER MISSION
		SETZM HOLDIT
		SLEEP	(0,B)
		 JRST	 INAGAIN]	;GLITCH AND REPRIEVE

	CAIE	B,"↑"			;MOVE TEXT UP?
	CAIN	B,";"	;no TOP key needed
	 JRST	 DOWNGO			;MOVE DOWN
	CAIE	B,"∞"
	CAIN	B,"\"	;no TOP key needed
	JRST [SETOM FOREVR#↔JRST US1]
	CAIE B,"R"
	CAIN B,"r"
	JRST [SETOM RONLY#↔JRST US0]
	CAIE B,"N"
	CAIN B,"n"
	JRST [SETZM RONLY↔JRST US0]
	CAIE B,"M"
	CAIN B,"m"
	JRST [MOVEM B,RONLY↔JRST US0]
	CAIE B,"V"
	CAIN B,"v"
	JRST [MOVEM B,RONLY↔SETOM VB#↔JRST US2]
	CAIL	B,"0"
	CAILE	B,"9"
	 JRST	 LEVE
	SUBI	B,"0"
	MOVEM	B,REPTT
	INCHRW	B
	JRST	US3

LEVE:	CAIE	B,"E"			;E MEANS EXIT WITHOUT CLEARING
	CAIN	B,"e"
	JRST	.+2
	 JRST	 LEAVE
	DPYSIZ	4001
	DPYPOS	-=425
	JSP	TEMP,AWAIT		;WAIT FOR READINESS
	SPCWAR 'SSW'
	JSP	C,DODD			;DISPLAY ONE MORE TIME
	PPACT	400000			;turn pp back on
	EXIT	1,			;inhibit reset on exit
	JRST	START

LEEVE:	HRLOI A,377777			;A LONG TIME
	SKIPE FOREVR
	JRST US1
LEAVE:	RESET
	SKIPE ONAPTY
	EXIT				;AVOID LEAVING "CP" IN POOR PTY'S INPUT BUF
	JSP	C,CLEAR
	SLEEP	(0,1)
	PTWR1W [0↔10000+"P"]		;<ESC>P, TURN SCREEN BACK ON
	EXIT

DODD:	SKIPN	DDSW			;ON DATA-DISK?
	 JRST	 (C)			;NO, THAT'S EASY
	SETZM DDACT
	DPYOUT BUFFER
	SETOM READY
	JRST (C)

CLEAR:	SKIPE	DDSW
	SKIPE ONAPTY
	 JRST	 (C)
	PTWR1W [0↔10000+"C"]
	JRST 	 (C)

US0:	SETZM VB#
	JRST US2
COMMENT ⊗Sw10, Spw -- Spacewar Loops⊗

DEFINE FULLCHECK  {
	PUSHJ	P,FLCHK
}		;THIS IS HERE FOR GENERALITY, BUT IT BETTER NOT ASSEMBLE INTO
		;MORE THAN ONE INSTRUCTION !!

DEFINE AGET(A,B)
{IFL B,{MOVEI A,-B}
IFG B,{MOVE A,B(2)}
ADDI A,(2)
}

; PDP-10 SPACEWAR LOOP, DISPLAYS RESULTS IF III DISPLAY, AND DOES
; THE INFORMATION RETRIEVAL IF THE PDP-6 IS DOWN

SW10:	JUMPGE 6,DIE
	SETZM	DEATHCT#
	SKIPE DDACT		;DO NOTHING IF DD STILL GOING
	DISMIS
	SKIPN OTHER		;WAS THE PDP-6 UP BEFORE?
	JUMPGE 5,SW10A		; IT WAS, JUMP IF IT STILL IS
	SETOM SIXSTP#		;DOWN, MAKE SURE IT STAYS DOWN WHILE
	SKIPE READY
	SKIPE SIXGO#
	JRST SW10A
	SKIPE HOLDIT
	JRST [SETZM READY↔DISMIS]	;FAKE IT IF PROG HACKING
	MOVE P,[IOWD PDLEN,PSHDWN]		; WE DO ITS JOB
	PUSHJ P,MAKLIN		;DO ITS JOB
SW10A:	SETZM SIXSTP#		;PDP-6 OK NOW
	SKIPN HOLDIT		;DON'T DISPLAY IF SUSPENDED
	SKIPE READY		;IF JOB NOT DONE
	 DISMIS			; JUST GO AWAY
	AOS T,SWCT#
	SKIPE DDSW
	TRNN T,1		;RUN A LITTLE SLOWER ON DD
	JRST 2,@[.+2]		;LEAVE IOT USER MODE
	DISMIS
	DPYOUT BUFFER		;DISPLAY GOODIES
	SETOM READY		;READY FOR MORE
	DISMIS

IFN DEBMOD,{
DEBDIS:	MOVE P,[IOWD PDLEN,PSHDWN]
	PUSHJ P,MAKLIN
	DPYOUT BUFFER
	JRST US1A
};DEBMOD

DIE:	SPCWAR 'SSW'		;FLUSH BOTH SPACEWARS
	DISMIS			;AND GO AWAY

; PDP-6 SPACEWAR LOOP, DOES THE INFORMATION RETRIEVAL

SPW:	MOVEI		;PREPARE TO MAKE NON-DESTRUCTIVE TESTS
	CAMN DDACT		;WAIT IF BUFFER STILL BUSY
	CAMN READY#
	JRST SPWX		;NOBODY WANTS IT YET
	SETOM SIXGO
	CAME SIXSTP
	JRST SPWX
	MOVE P,[IOWD PDLEN,PSHDWN]
	PUSHJ P,MAKLIN		;SET UP THE BUFFER
SPWX:	SETZM SIXGO
	DISMIS
COMMENT ⊗Maklin -- Information Retrieval⊗

TTYSPW:	RESCAN			;FROM TTY, MAYBE SHORT MODE
	PUSH	P,1
	PUSH	P,3
	MOVEI	1,0
ARRAY TTYBHD[3]
	MOVSI	3,TTYBHD
	MOVSI	2,'TTY'
	SKIPE	RENFLG
	MOVSI	2,'LPT'
	OPEN	0,1
	HALT	.-1
	POP	P,3
	POP	P,1
TTYSP2:	INCHWL 2
	ANDI 2,177		;HOW WOULD BUCKY BITS GET IN ANYWAY?
	CAIE 2,175
	CAIN 2,12
	JRST TTYSP3		;EOL
	CAIE 2,"/"
	JRST TTYSP2
	INCHWL 2
	CAIE 2,"Q"
	CAIN 2,"q"
	SETOM QUICKY
	JRST TTYSP2

MAKLIN:	IFN DEBMOD,{SKIPN DEBUG}
	CONSZ 40		;IS THERE A SECOND PR-REL BOX?
TTYSP3:	JRST [	MOVE 2,ADR10	;YES, USE SETPR2 MAPPING
		JRST PDP10WIN]
	HRROS 2			;NO, MAKE INFINITE PROTECTION,
	DATAO 0,2		;AND SET UP FOR WRAPAROUND ADDRESSING
	HRRZS 2			;INTO THE SYSTEM
	MOVNS 2

PDP10W:	SETZM TSLVL#
	SETZM NRUNJ#		;NO. OF RUNNING JOBS
	SETZM NRUNK#		;CORE OF RUNNING JOBS
	SETZM INK#
	SETZM SWPK#
	SETZM CANQUIT#		;CAN'T QUIT YET
	SKIPE A,HLOC
	SETOM 1(A)		;RESTORE BIT 35 OF HALT WORD
	SETZM NLINES#		;NO LINES DISPLAYED YET
	SETZM RJOB
	AOS PASSN
	AGET A,JOB
	AGET B,JOBQUE
	MOVE A,(A)
	ADDI B,(A)
	MOVM B,(B)
	MOVEM B,RQUE#
	CAIE B,RUNQ
	CAIN B,TQ
	MOVEM A,RJOB#
	MOVE A,[JOBCOR-1,,JOBCOR]
	BLT A,JOBCOR+NUMJOB-1
	SETZM	LINES#		;START AT LINE 1
COMMENT ⊗which job to do next?⊗

	MOVEM	P,SAVPDP	;FULLCHECK RESTORES TO HERE WHEN ESCAPING
	MOVEI J,1		;JOB NUMBER IN J
	MOVEI SPACE," "
	MOVE PTR,[POINT 7,BUFSTR]
	MOVEI T,2
	MOVEM T,WHICH#
	SETZM INDENT#		;INITIALIZE INDENTATION

; RETURN HERE FOR EACH JOB
DOJOBS:	MOVE T,2
	ADDI T,(J)
	MOVE D,JBTSTS(2)
	ADDI D,(T)
	MOVE D,(D)
	TLNN D,JNA
	JRST NOJOB
	MOVE B,JBTLIN(2)
	ADDI B,(T)
	MOVE B,(B)
	MOVE A,WHICH
	XCT (A)[TLNE D,JSEG	;SEGMENTS LAST
		PUSHJ P,[PHTEST:TLNN D,JLOG
				CAME B,[-1]
		CPOPJ1:		AOS (P)
				POPJ P,]
		PUSHJ P,[TLNN D,JSEG
			PUSHJ P,PHTEST
			JRST CPOPJ1
			CAME B,[-1]		;DETACHED TTYS AREN'T PTYS
			TLNN B,4000		;PTY?
			POPJ P,
			HRRZ C,B		;GET LINE NUMBER
			SUB C,PTYL0		;MAKE IT INDEX INTO PTYJOB
			ADD C,PTYPTR
			ADDI C,(2)		;RELOCATE
			SKIPE (C)		;IF NO JOB #, PRINT AS REAL JOB
			AOS (P)
			POPJ P,]
				];**WHICH
	PUSHJ P,JBLIN
NOJOB:	ADDI J,1		;NEXT JOB
	CAMG J,JOBN(2)		;ALL DONE?
	JRST DOJOBS		;NO, DO IT -- AGAIN
	SOSGE A,WHICH
	JRST NOSPEC
	MOVEI J,1		;START WITH JOB 1 AGAIN
	XCT (A)[JRST SEGTIT
		JRST PHANT]

PHANT:	FULLCHECK
	JRST DOJOBS
	STRING < 
>
	JRST DOJOBS

SEGTIT:	SKIPN RONLY		;NO SEGMENTS IF RUNNING ONLY MODE
	SKIPE QUICKY		;  NOR QUICK MODE
	JRST DOJOBS
	FULLCHECK
	JRST DOJOBS
	STRING < 
>
	FULLCHECK
	JRST DOJOBS
	STRING <JOB  SEGNAM  SIZE  NJOBS
>
	FULLCHECK
	JRST DOJOBS
	STRING < 
>
	JRST DOJOBS
COMMENT ⊗jblin -- job info for one job⊗
JBLIN:	AOS INDENT
	CAMN J,RJOB
	SKIPA C,RQUE
	SKIPA C,JOBQUE(2)
	JRST .+3
	ADDI C,(T)
	MOVM C,(C)
	MOVEM C,HISQUE#
	SKIPN WHICH		;DON'T TEST SEGS FOR RUNNING
	JRST JBLIN1
	SETOM JRUN#		;FLAG JOB AS RUNNING OR NOT
	CAIE C,NULQ
	CAIN C,STOPQ
	JRST JBLIN4
	CAIE C,IOWQ
	CAIN C,INTWQ
	JRST JBLIN4
	MOVNI A,runwin+1	;WILL keep in "RUN" queue for runwin passes
	HRLM A,LASTIM(J)
JBLIN4:	MOVSI A,1
	ADDB A,LASTIM(J)
	SKIPGE A
	AOSA NRUNJ
JBLIN1:	SETZM JRUN
	SETZM DOSW#		;ASSUME LINE WON'T BE DISPLAYED
	HLLOS LASTIM(J)		;MARK WHETHER LINE DISPLAYED
	SKIPN A,RONLY
	JRST JBLIN2
	JUMPG A,[	MOVE A,PRJPRG(2)
		ADDI A,(T)
		HRRZ B,(A)
		SKIPE VB
		JRST VBALL			;VOLLEYBALL PLAYERS ONLY
		CAME B,PN1
		CAMN B,PN2
		JRST JBLIN2
		HRRZ B,NUMJOB(A)		;DSKPPN IS RIGHT AFTER JOBNAM
		CAME B,PN1
		CAMN B,PN2
		JRST JBLIN2
		JRST NODISP]
	SKIPE JRUN
	JRST JBLIN2
NODISP:	HLLZS LASTIM(J)		;THIS JOB OMITTED
	JRST GETSWPK

VBALL:	MOVSI A,-VBLNG		;CHECK VOLLEYBALL PLAYER TABLE
VBALL1:	CAMN B,VBTAB(A)
	JRST JBLIN2		;YES
	AOBJN A,VBALL1
	JRST NODISP		;NO

JBLIN2:	FULLCHECK		;SHOULD WE DRAW THIS LINE?
	 JRST	 GETSWPK	; NO, BUT COLLECT INFORMATION ABOUT JOB

DRAWL:	SKIPE QUICKY		;IF QUICK OUTPUT,
	JRST [	MOVE A,JBTLIN(2)
		ADDI A,(T)
		MOVE A,(A)
		AOJE A,CHKPTY	;  DON'T TYPE DETACHED JOBS
		JRST PUTPPN	;  JUST PPN AND TTY
]
	SKIPA A,INDENT
	IDPB SPACE,PTR
	SOJG A,.-1
	MOVE A,J
	IDIVI A,=10
	ADDI B,60
	JUMPE A,[IDPB B,PTR
		IDPB SPACE,PTR
		JRST ONEDIG]
	ADDI A,60
	IDPB A,PTR
	IDPB B,PTR
ONEDIG:	SKIPN WHICH
	JRST ISSEG1
	INC 2
	MOVE B,QNAMS(2)
	ADDI B,(2)
	ADD B,HISQUE
	MOVE B,(B)
	LDB A,[POINT 7,B,6]
	IDPB A,PTR
	LDB A,[POINT 7,B,13]
	IDPB A,PTR
	LDB A,[POINT 7,B,20]
	IDPB A,PTR
	LDB A,[POINT 7,B,27]
	IDPB A,PTR
ISSEG1:	MOVEI A," "
	AGET B,SHFWAT
	CAMN J,(B)
	MOVEI A,"↔"
	TLNE D,SWP
	MOVEI A,"*"
	AGET B,BIGHOL
	CAMN J,FIT(B)
	MOVEI A,"↓"
	CAMN J,FORCE(B)
	MOVEI A,"↑"
	CAMN J,SEGWAIT(B)
	MOVEI A,"→"
	TRNE D,JLOCK
	MOVEI A,"⊗"		;INDICATE LOCKED
	CAMN J,RJOB
	MOVEI A,"-"
	MOVE B,JBTSIN(2)
	ADDI B,(T)
	SKIPE (B)
	MOVEI A,"←"		;IN JBTSIN LIST
	IDPB A,PTR
	SKIPN WHICH
	JRST [	MOVEI A," "
		TLNN D,JWP
		MOVEI A,"W"
		IDPB A,PTR
		JRST ISSEG2]
	INC 2
PUTPPN:	MOVE A,PRJPRG(2)
	ADDI A,(T)
	MOVE B,(A)
	PUSHJ P,SIXOUT
	INC 2
	MOVE A,JBTLIN(2)
	ADDI A,(T)
	HRLZ A,(A)
	JUMPL A,[STRING <DET>
		JRST DETLIN]
	LSH A,9
	ROT A,3
	TRNN A,7
	TROA A," "
	ADDI A,"0"
	IDPB A,PTR
	ROT A,3
	TRZN A,7⊗3
	TRNE A,7
	TROA A,"0"
	HRRI A," "
	IDPB A,PTR
	HRRI A,"0"⊗-3
	ROT A,3
	IDPB A,PTR
DETLIN:	SKIPE QUICKY		;THAT'S ALL IF QUICKY OUTPUT
	JRST NOSW6
	INC 1
ISSEG2:	INC 1
	MOVE A,["STOPQ"⊗1]
	MOVE A,JOBNAM(2)
	ADDI A,(T)
	MOVE B,(A)
	PUSHJ P,SIXOUT
	INC 1
GETSWPK:MOVE A,JBTADR(2)
	ADDI A,(T)
	HLRZ A,(A)
	ADDI A,1777
	IDIVI A,2000
	TLNE D,SWP
	JRST [	MOVE A,JBTSWP(2)
		ADDI A,(T)
		MOVE A,(A)
		ANDI A,377
		ADDM A,SWPK
		JRST .+2]
	ADDM A,INK
	SKIPE JRUN
	ADDM A,NRUNK#		;ADD UP CORE FOR RUNNING JOBS
	HRRM A,JOBCOR(J)
	SKIPN	DOSW#		;ARE WE DRAWING?
	 JRST	 GETGSL		; NO, COLLECT SL INFO
	PUSHJ P,NUM3
	PUT "K"
	TLNE D,JSEG
	JRST [	INC 3
		MOVE A,NJOBS(2)
		ADDI A,(T)
		MOVE A,(A)
		PUSHJ P,NUM3
		JRST NOSW6]
;	INC 1
	MOVE A,TTIME(2)
	ADDI A,(T)
	MOVE A,(A)
	IDIVI A,=60
	IDIVI A,=3600
	JUMPE A,[INC 2
		JRST NOHOUR]
	ADDI A,60
	IDPB A,PTR
	PUT ":"
NOHOUR:	IDIVI B,=60*=10
	CAIN A,0
	JUMPE B,.+2
	ADDI B,20
	ADDI B,40
	IDPB B,PTR
	MOVE A,C
	IDIVI A,=60
	ADDI A,60
	IDPB A,PTR
	PUT ":"
	IDIVI B,=10
	ADDI B,60
	IDPB B,PTR
	ADDI C,60
	IDPB C,PTR
	INC 1
	MOVE A,JBTJL(2)
	ADDI A,(T)
	SKIPN B,(A)
	JRST [	INC 4
		JRST NOJL]
	ADDI B,(2)
	MOVEI C,JLLENGTH
	SETZ A,
JLOOP:	ADD A,(B)
	ADDI B,1
	SOJG C,JLOOP
	IMULI A,=100
	HLRZS A
	IDIVI A,JLLENGTH
	CAIL A,=100
	MOVEI A,=99
	SKIPN A
	JRST [	INC 3
		JRST NOJL]
	PUSHJ P,NUM
	PUT "%"
NOJL:	INC 1
GETGSL:	MOVE A,JBTGSL(2)
	ADDI A,(T)
	HRRZ A,(A)
	MOVE B,J
	MOVE C,PRJPRG(2)
	ADDI C,(T)
	HRRZ D,(C)
	SUBI B,1
SLOOP:	SUBI C,1
	HRRZ RING,(C)
	CAMN RING,D
	JRST NOADD
	SOJG B,SLOOP
ADDIT:	ADDM A,TSLVL
NOADD:	SKIPN	DOSW		;ARE WE DRAWING?
	JRST	NOSL2		;NO
	ADDI A,400000/=100	;ROUND HIS SERVICE LEVEL
	IMULI A,=100
	HLRZS A
	JUMPE A,[INC 3
		JRST NOSLVL]
	PUSHJ P,NUM
	PUT "%"
NOSLVL:	INC 2
NOSL2:	MOVE A,JBTSTS(2)
	ADDI A,(T)
	LDB A,[POINT 6,(A),35]	;SEGMENT NUMBER
	MOVE D,A
	SKIPN	DOSW
	 JRST	 NOSEG
	JUMPE A,[INC 4
		JRST NOSEG]
	PUSHJ P,NUM
	INC 2
NOSEG:	MOVE A,SPWGO(2)
	ADDI A,(T)
	HLRZ A,(A)
	ANDI A,17
	JUMPE A,[SKIPN DOSW
		  JRST  NOSW10
		INC 2
		JRST NOSW10]
	HRRZS JOBCOR(J)
	HRRZS JOBCOR(D)
	SKIPN	DOSW		;ARE WE DRAWING?
	 JRST	 NOSW10		; NO
	IDIVI A,10
	JUMPE A,.+2
	ADDI A,20
	ADDI A,40
	IDPB A,PTR
	ADDI B,60
	IDPB B,PTR
NOSW10:	MOVE A,SP2GO(2)
	ADDI A,(2)
	ADDI A,(J)
	HLRZ A,(A)
	ANDI A,17
	JUMPE A,NOSW6
	HRRZS JOBCOR(J)
	HRRZS JOBCOR(D)
	SKIPN	DOSW
	 JRST	 NOSW6		;FORGET IF NOT DRAWING
	INC 2
	IDIVI A,10
	JUMPE A,.+2
	ADDI A,20
	ADDI A,40
	IDPB A,PTR
	ADDI B,60
	IDPB B,PTR
NOSW6:	SKIPN	DOSW
	 JRST CHKPTY
	PUT 15
	PUT 12
CHKPTY:
	MOVE A,PTYPTR
	ADDI A,(2)
	HLL A,PTYPTR
CKPTY1:	CAME J,(A)
	JRST CKPTY2
	PUSH P,A
	SUB A,PTYPTR
	ADD A,PTYL0
	MOVE B,TTYTAB(2)
	ADDI B,(A)
	SKIPN B,(B)
	JRST CKPTY3
	ADDI B,(2)
	PUSH P,J
	LDB J,[POINT 6,1(B),5]
	MOVE T,J
	ADDI T,(2)
	MOVE D,JBTSTS(2)
	ADDI D,(T)
	MOVE D,(D)
	TLNE D,JNA		;JOB HERE?
	PUSHJ P,JBLIN
	POP P,J
CKPTY3:	POP P,A
CKPTY2:	AOBJN A,CKPTY1
	SOS INDENT
	POPJ P,
COMMENT ⊗System Statistics⊗

NOSPEC:	SKIPE QUICKY
	JRST FULL
	FULLCHECK
	 JRST	NL1		;NOT DRAWING THIS LINE
	INC 1
	PUT 15
	PUT 12
NL1:	FULLCHECK
	 JRST	NL2
	STRING <       UPTIME= >
NL2:	MOVE RING,RNGSAV
	MOVE A,UPTIME(2)
	ADDI A,(2)
	MOVE A,(A)
	MOVEM A,RUN(RING)
	SKIPN	DOSW
	 JRST	 NL3
	IDIVI A,=60*=60		;MAKE IT MINUTES

	IDIVI A,=60*=24		;GET DAYS
	PUSH P,B
	JUMPE A,NODAYS
	PUSHJ P,NUM3
	STRING < da >
NODAYS:	POP P,A
	IDIVI A,=60
	MOVE C,B
	PUSHJ P,NUM
	STRING	< hr >
	MOVE A,C
	PUSHJ P,NUM
	STRING	< min
>

NL3:	MOVE A,[POINT 7,[ASCIZ/       NULTIMES /]]
	MOVE C,TTIME(2)
	MOVE D,[,NUL(RING)]
	PUSHJ P,TIMIT
	MOVE A,[440700,,[ASCIZ/       WASTED   /]]
	MOVE C,STBEG(2)
	ADDI C,NJRNUL
	MOVE D,[,LOST(RING)]
	PUSHJ P,TIMIT
	FULLCHECK
	 JRST	 NL4		;DON'T DRAW IF NOT DRAWING
	STRING	<       CORE:   >
	MOVE A,INK
	PUSHJ P,NUM3
	PUT "K"
	INC 1
	MOVE A,SWPK
	PUSHJ P,NUM3
	STRING	<K*
>
NL4:	FULLCHECK
	 JRST	NL5A
	STRING	<       USABLE  >
	AGET A,BIGHOL
	MOVE A,(A)
	PUSHJ P,NUM3
	STRING	<K >
	MOVEI J,NUMJOB-1
	MOVEI A,
	SKIPL JOBCOR(J)
	ADD A,JOBCOR(J)
	SOJG J,.-2
	AGET D,CORMAX
	MOVE D,(D)
	LSH D,-12
	SUBM D,A
	PUSHJ P,NUM3
	STRING	<K >
	MOVE A,D
	PUSHJ P,NUM3
	STRING	<K
>
NL5A:	MOVEI C,AVGING
	CAMLE C,PASSN			;AVG. HARD WHILE STARTING UP
	MOVEI C,2
	HRLZ A,NRUNK
	SUB A,AVGK
	EXCH A,AVGK
	IMUL A,C
	ADD A,AVGK
	IDIV A,C
	MOVEM A,AVGK
	HRLZ A,NRUNJ
	SUB A,AVGRUN
	EXCH A,AVGRUN
	IMUL A,C
	ADD A,AVGRUN
	IDIV A,C
	MOVEM A,AVGRUN
	FULLCHECK
	 JRST NL5
	STRING <       RUNNING JOBS=>
	HLRZ A,AVGRUN
	PUSHJ P,NUM3
	STRING <, >
	HLRZ A,AVGK
	PUSHJ P,NUM3
	STRING <K
>
NL5:	FULLCHECK
	 JRST	NL6
	STRING	<       TOTAL SLEVEL= >
	MOVE A,TSLVL
	ADDI A,400000/=100	;ROUND TOTAL SERVICE LEVEL
	IMULI A,=100
	HLRZS A
	PUSHJ P,NUM
	STRING	<%
>
NL6:	FULLCHECK
	 JRST	NL7
	STRING	< 
>
COMMENT ⊗Devices, Files⊗

NL7:	SETOM CANQUIT		;IF LINE OVERFLOW, CAN QUIT
	MOVE T,DEVLST(2)
	ADDI T,(2)
	HLRZ T,(T)
	ADDI T,(2)
	JRST NODEV

DEVSRC:	ADDI T,(2)
	LDB A,[POINT 6,DEVCHR(T),5]
	HRRZ A,LASTIM(A)	;THIS JOB WAS DISPLAYED??
	SKIPE RONLY		;MAKE SURE ALL FILES GET DISPLAYED IN NORMAL MODE
	JUMPE A,NODEV		;OTHERWISE, ONLY FOR JOBS ON SCREEN
	MOVE D,DEVMOD(T)
	TRNE D,600000		;ASSIGNED OR INITED?
	FULLCHECK		;OR NOT TIME YET?
	 JRST	NODEV		;NOT GOING OR NOT TIME YET
	MOVE B,DEVLOG(T)
	PUSHJ P,SIXOUT
	INC 1
	MOVE B,DEVNAM(T)
	PUSHJ P,SIXOUT
	MOVEI A," "
	TRNE D,400000
	MOVEI A,"#"
	IDPB A,PTR
	INC 1
	LDB A,[POINT 6,DEVCHR(T),5]
	PUSHJ P,NUM
	TLNE D,DSKDEV
	SKIPN B,DEVFIL(T)
	JRST CRLF
	INC 2
	PUSHJ P,SIXOUT
	INC 2
	HLLZ B,DEVEXT(T)
	MOVEI C,3
	PUSHJ P,SIXOUT+1
	INC 1
	MOVE B,DEVPPN(T)
	PUSHJ P,SIXOUT
	INC 2
	MOVE A,FILLEN(T)
	ADDI A,177		;ROUND UP
	IDIVI A,200
	TRNN A,7700
	INC 1
	TRNN A,7000
	INC 1
	PUSHJ P,OCTOUT
	INC 2
	MOVE A,USETP(T)
	TRNN A,7700
	INC 1
	TRNN A,7000
	INC 1
	PUSHJ P,OCTOUT
	MOVE A,DEVIOS(T)
	INC 1
	MOVEI B,"R"
	TLNE A,READB
	IDPB B,PTR
	MOVEI B,"W"
	TLNE A,WRITEB
	IDPB B,PTR
	MOVEI B,"A"
	TLNE A,ALTERB
	IDPB B,PTR
	MOVEI B,"E"
	TLNE A,IOEND
	IDPB B,PTR
CRLF:	PUT 15
	PUT 12
NODEV:	HLRZ T,DEVSER(T)
	JUMPN T,DEVSRC
ALLDON:	SKIPN DDSW
	JRST FULL
	MOVEI T,DDSIZ
	SUB T,NLINES
	JUMPLE T,FULL
FLUP:	PUT " "			;NEW SCREEN IS SMALLER - PUT OUT BLANK LINES
	PUT 15			;TO ERASE DD
	PUT 12
	SOJG T,FLUP
FULL:	TDZA A,A
	IDPB A,PTR
	TLNE PTR,760000
	JRST .-2
	SETZM 1(PTR)		;ANDY WILL DO THIS ANYWAY, BUT ...
	HRRZM PTR,HLOC		;REMEMBER WHERE WE CLOBBERED BIT 35
	SUBI PTR,CMDWRD-1-1
	HRRZM PTR,BUFFER+1
	MOVEM RING,RNGSAV
	SETZM READY
	POPJ P,
COMMENT ⊗Timit, Flchk, Await -- Random routines⊗

TIMIT:	FULLCHECK		;SHOULD WE DRAW THIS LINE?
	SKIPA			;NO
	PUSHJ P,STRNG
	ADDI C,(2)
	MOVE A,(C)
	MOVE RING,RNGSAV
	MOVEM A,@D		;SAVE IT IN RING BUFFER
	SKIPN	DOSW		;ARE WE DRAWING?
	POPJ	P,
	IMULI A,=100
	IDIV A,RUN(RING)
	PUSHJ P,NUM
	PUT "%"
	INC 1
	MOVE A,@D
	MOVE B,RUN(RING)
	AOBJN RING,.+2		;ADVANCE RING COUNTER
	MOVSI RING,-RINGLN
	MOVE C,PASSN
	CAIG C,RINGLN
	JRST [	SUB A,(D)
		SUB B,RUN
		JRST .+3]
	SUB A,@D
	SUB B,RUN(RING)
	IMULI A,=100
	IDIV A,B
	PUSHJ P,NUM3
	STRING	<%
>
	POPJ P,

FLCHK:	SETZM	DOSW		;ASSUME WE WON'T DRAW THIS LINE
	AOS	TEMP,LINES	;NEXT LINE
	CAMLE	TEMP,LSTLIN	;ARE WE PAST THE ALLOWABLE END?
	 JRST	 [SKIPN CANQUIT	;CRITICAL STUFF DONE?
		  POPJ P,	; NO, HAVE TO CONTINUE
		  MOVE P,SAVPDP#;YES,
		  JRST ALLDON]	; QUIT
	CAML	TEMP,FSTLIN	;HAVE WE REACHED THE BEGINNING YET?
	AOSA (P)
	POPJ	P,
	SETOM DOSW
	AOS NLINES		;COUNT LINES DRAWN
	POPJ P,

AWAIT:	SETOM HOLDIT#		;KEEP 10 FROM DISPLAYING
	SKIPN	READY		;IS PDP-6 (OR SURROGATE) IDLE?
	 JRST	 (TEMP)		; YES, DONE
	SLEEP	(0,B)		;WAIT FOR 6 TO FINISH
	JRST	AWAIT
COMMENT ⊗Num, Octout, Sixout, Strng -- Output Routines⊗

NUM:	IDIVI A,=10
	JUMPE A,.+2
	ADDI A,20
	ADDI A,40
	IDPB A,PTR
	ADDI B,60
	IDPB B,PTR
movem p,.+2
	POPJ P,
0
-1;a bug test by ME: SPACEWAR LOSSAGE AT NUM3
0

NUM3:
movem a,.-1
	IDIVI A,=100
	JUMPE A,.+2
	ADDI A,20
	ADDI A,40
	IDPB A,PTR
	IDIVI B,=10
	CAIN A,40
	JUMPE B,.+2
	ADDI B,20
	ADDI B,40
	IDPB B,PTR
	ADDI C,60
	IDPB C,PTR
	POPJ P,

OCTOUT:	CAIG A,7
	INC 1
OCTOU1:	IDIVI A,10
	HRLM B,(P)
	JUMPE A,.+2
	PUSHJ P,OCTOU1
	HLRZ B,(P)
	ADDI B,60
	IDPB B,PTR
	POPJ P,

SIXOUT:	MOVEI C,6
	SETZ A,
	LSHC A,6
	ADDI A,40
	IDPB A,PTR
	SOJG C,SIXOUT+1
	POPJ P,

ST1:	IDPB B,PTR
STRNG:	ILDB B,A
	JUMPN B,ST1
	POPJ P,
	SUBTTL	Data
PSHDWN:	BLOCK PDLEN
NUL:	BLOCK RINGLN
RUN:	BLOCK RINGLN
LOST:	BLOCK RINGLN
	-1
JOBCOR:	BLOCK NUMJOB
LASTIM:	BLOCK NUMJOB

QCKHED:	ASCIZ /
PPN     TTY

/

VBTAB:	'JBR'		;FIRST PLACE BECAUSE IT'S HIS IDEA
	' BH'		;AND MY IMPLIMENTATION
	'LES'
	'JMC'
	'JXJ'
	'REF'
	'MLM'
	'BPM'
	'PAM'
	'DRB'
	'RHT'
	'BLF'
	'DAV'
	'DCS'
	'LCS'
	' YS'
	'CDT'
	'DEW'
	'RCB'
	'AHB'
	'PAW'
	'DWP'
	'HJS'
	'PMF'
	'PVN'
	'JFR'
	' JJ'
VBLNG←←.-VBTAB

DEFINE CW(C1,B1,C2,B2,C3,B3)
{	<BYTE(8)<B1>,<B2>,<B3>(3)<C1>,<C2>,<C3>>!4	}

CM1:	CW	1,46,2,0,3,1
CM2:	CW	4,0,4,1,5,10
;CM3:	CW	4,0,4,1,5,11
 
LIT
VAR
HLOC:	0	;LOC-1 OF HALT IN BUFFER (MUST RESTORE BIT 35)
BUFFER:	TRN CMDWRD	;USE OVERLAPPED & DOUBLE FIELD MODES ON DD
	0
DDACT:	0		;XFER IN PROGRESS
	CMDWR1		;WHERE TO SET FIELD

CMDWRD:	0
CMDWR1:	BYTE(11)<-777>,640(3)2,1(2)1,2(3)3
TTYBUF:	ASCID/
JOB QUEUE    P,PN  LINE JOBNAM SIZE   TIME  PL  SL SEG SW10 SW6
 
/
	1			;STOP TTYUUO HERE
BUFSTR:
	REPEAT =62*IIISIZ/5,<1
>
END START